package com.itheima.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.itheima.config.R;
import com.itheima.config.ThreadLocals;
import com.itheima.pojo.AddressBook;
import com.itheima.pojo.User;
import com.itheima.service.AddressBookService;
import com.itheima.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("/addressBook")
public class AddressBookController {


    @Autowired
    private AddressBookService addressBookService;

    /**
     * 新增地址
     * @param addressBook
     * @return
     */
    @PostMapping
    public R<String> save(@RequestBody AddressBook addressBook){

        // 从线程获取 操作的用户的ID
        Long userid = (Long) ThreadLocals.getthread().get();

        //  用户ID 对应 地址表的 UserId
        addressBook.setUserId(userid);

        // 新增地址数据
        addressBookService.save(addressBook);

        return R.success("保存地址成功");
    }


    /**
     * 设置默认地址
     * @param addressBook
     * @return
     */
    @PutMapping("/default")
    public R<String> defaultAddress(@RequestBody AddressBook addressBook){

        /**
         * 给一个地址设置成默认地址
         * 先把这个用户下面的所有的地址变成非默认的
         * 然后再根据对象中的值把一个地址的默认字段设置成1
         */

        LambdaUpdateWrapper<AddressBook> wrapper = new LambdaUpdateWrapper<>();
        // 把所有地址设置成非默认地址
        wrapper.set(AddressBook::getIsDefault,0);

        // 条件是地址表 和 用户表关联   用户的ID 是从线程中获取
        //wrapper.eq(AddressBook::getUserId,ThreadLocals.getthread().get());

        // 根据上面的条件把 这个用户下面的所有地址设置成非默认的
        addressBookService.update(wrapper);

       /*根据用户传递的ID  也就是用户下的一个地址 获取出来
        AddressBook byId = addressBookService.getById(addressBook.getId());
        byId.setIsDefault(1);\
        // 修改这个地址 为默认地址值
        // byId.setIsDefault(1);
        */
        addressBook.setIsDefault(1);
        addressBookService.updateById(addressBook);

        return  R.success("设置成功");
    }


    /**
     * 修改地址 中的 回显
     * @param id
     * @return
     */
    @GetMapping("/{id}")
    public R<AddressBook> select(@PathVariable Long id){

        AddressBook byId = addressBookService.getById(id);

        if (byId == null){
            return R.error("查询失败");
        }else {
            return R.success(byId);
        }
    }


    /**
     *   TODO 查询默认地址  功能未测试 不知道哪个页面调用
     * @return
     */
    @GetMapping("/default")
    public R<AddressBook> selectDefaultAddress(){

        LambdaQueryWrapper<AddressBook> wrapper = new LambdaQueryWrapper<>();

        //根据用户ID 查询 这个用户下面的地址  而且是 默认地址    获取当前用户IDis  Default
        wrapper.eq(AddressBook::getUserId,ThreadLocals.getthread().get())
                .eq(AddressBook::getIsDefault,1);

        // 根据ID 查询出来了
        AddressBook bookServiceById = addressBookService.getOne(wrapper);


        // 返回查询的 对象
        return R.success(bookServiceById);

    }


    /**
     * 查询用户的全部地址
     * @return
     */
    @GetMapping("/list")
    public R<List<AddressBook>> allAddress(){

        // 获取当前用户IDis  Default
        Long userId = (Long)ThreadLocals.getthread().get();

        // 用户ID 关联  地址 UserID
        LambdaQueryWrapper<AddressBook> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(AddressBook::getUserId,userId);

        // 一个用户会有多个地址 所有用List查询
        List<AddressBook> list = addressBookService.list(wrapper);

        return R.success(list);
    }


    /**
     * 删除地址
     * @param ids
     * @return
     */
    @DeleteMapping
    public R<String> delect(@RequestParam List<Long> ids){

        for (Long id : ids) {
            addressBookService.removeById(id);
        }
        return R.success("删除成功");
    }


    /**
     * 修改地址
     * @param addressBook
     * @return
     */
    @PutMapping
    public R<String> updeta(@RequestBody AddressBook  addressBook){

        addressBookService.updateById(addressBook);

        return R.success("修改成功");
    }

}

